home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-06-24 | 15.0 KB | 578 lines | [TEXT/EDIT] |
- ; aSupport.txt -- interface routines 3:37:12 PM 2/4/87
-
- ; Fri Jan 22, 1988 12:52:12 version 0.3
- ; Fri Feb 12, 1988 13:35:10 3+ menus
- ; Wed Mar 30, 1988 13:37:36 opener routine
- ; Thu Apr 07, 1988 16:00:59 nested loads
- ; Mon Apr 18, 1988 14:06:09 restructure variables, echo
- ; Sun May 01, 1988 10:38:11 fix emptyFS to skip nil handles
- ; Mon May 27, 1991 17:41:00 use wne based event loop and zoomin&out handlers
- ; Fri May 30, 1991 05:09:00 handler for "high level events"
-
- theWindow: DC.L 0 ; pointer
- WContRect: DC.W 0,0
- WSize: DC.W WHeight,WWidth
-
- Activate: DC.W drop-Base ; rel. addr. of enact routine
- Update: DC.W curs-Base ; rel. addr. of draw routine
- Button: DC.W beep-Base ; rel. addr. for Content action
- YourMenu: DC.W menus-Base ; rel. addr. for additional menus
- Runner: DC.W null-Base ; rel. addr. for idle action
- Closer: DC.W bye-Base ; rel. addr. for Close action
- About: DC.W doabout-base ; the about thingy
- Opener: DC.W null-base ; open routine 3/30/88
- Echo: DC.W -1
-
- AppleMenu: DC.L 0
- FileMenu: DC.L 0
- EditMenu: DC.L 0
-
- TextO: DC.L 0 ; TextOffset
- TextE: DC.L 0 ; TextEnd
- TextH: DC.L 0 ; TextHandle
- FStack: DCB.L 5,0 ; text block handles
- FOfsets: DCB.L 5,0 ; text block offsets
- FEnds: DCB.L 5,0 ; text block ends
- FSPtr: DC.W -4 ; file stack pointer
-
- Events: DC.W Null-Base ; Null Event - do nothing
- DC.W BDEvt-Base ; Mouse button down
- DC.W Null-Base ; Mouse button up - do nothing
- DC.W KeyEvt-Base ; Key down
- DC.W Null-Base ; Key up - do nothing
- DC.W KeyEvt-Base ; Auto key
- DC.W UDEvt-Base ; Update window
- DC.W Null-Base ; Disk inserted event - do nothing
- DC.W ActEvt-Base ; Activate window
- DC.W Null-Base ; do nothing
- DC.W Null-Base ; Network - do nothing
- DC.W Null-Base ; I/O driver - do nothing
- DC.W Null-Base ; Undefined1 - do nothing
- DC.W Null-Base ; Undefined2 - do nothing
- DC.W Null-Base ; Undefined3 - do nothing
- DC.W Null-Base ; MultiTask: mouse moved & suspend/resume - do nothing
-
- EventRecord:
- What: DC.W 0 ; WhatEvent#
- Message: DC.W 0 ; keycode, wptr, etc.
- ASCII: DC.W 0 ; ASCII code
- When: DC.L 0 ; Ticks since startup til this Event
- Where: ; Mouse coordinate for this Event
- V: DC.W 0
- H: DC.W 0
- Modify: DC.W 0 ; State of modifier keys (Shift etc.)
-
- WWindow: DC.L 0 ; WindowPtr returned by FindWindow
- Clicks: DC.W Null-Base ; InDesk
- DC.W MenuBar-Base ; InMenu Bar
- DC.W DARgn-Base ; InSystem Window
- DC.W ContentRgn-Base ; InContent region
- DC.W DragRgn-Base ; InDrag region
- DC.W Null-Base ; no grow region in this application
- DC.W CloseRgn-Base ; ByeByeBox
- DC.W beep-base ; inZoomIn *** new 5/27/91 ***
- DC.W beep-base ; inZoomOut *** new 5/27/91 ***
-
- MFlag: DC.W 0 ; true if multitasking *** 5/26/91 ***
- HLEHook: DC.W null-base ; high level events hook *** 5/27/91 ***
-
- Scratch: DC.L 0 ; various uses
-
- Menus: DC.W Fmenu-base
- DC.W Emenu-base
- Fmenu: DC.W open-base ; Open…
- DC.W null-base ; -
- DC.W save-base ; Save
- DC.W mon-base ; Debug
- DC.W null-base ; -
- DC.W beep-base ; Print
- DC.W null-base ; -
- DC.W bye-base ; Quit
- Emenu: DC.W beep-base ; Undo
- DC.W null-base ; -
- DC.W beep-base ; Cut
- DC.W beep-base ; Copy
- DC.W paste-base ; Paste
- DC.W beep-base ; Clear
-
- BigRect: DC.W $8000,$8000,$7FFF,$7FFF ; for dragging
-
- KFlag: DC.W 0 ; key flag
-
- ; ----- Startup Code -----
-
- MacStart: ; load the menus, setup a window and create a data block
- MOVEQ #1,D3
- @0: CLR.L -(SP) ; room
- MOVE D3,-(SP) ; Push menu ID
- _GetRMenu ; Get menu from resource.
- MOVE D3,D0
- SUBQ #1,D0
- ASL #2,D0
- LEA AppleMenu,A0 ; menu handle data area
- MOVE.L (SP),0(A0,D0.W) ; Save it.
- CLR -(SP) ; Push a 0 for append.
- _InsertMenu
- ADDQ #1,D3
- CMP #4,D3
- BNE.S @0 ; do the next menu
-
- MOVE.L AppleMenu,-(SP)
- MOVE.L #'DRVR',-(SP) ; Load all DRVR resource types.
- _AddResMenu ; Add the DA's.
- _DrawMenuBar
-
- ; create a window
- CLR.L -(SP) ; make room for the new window pointer
- MOVE #128,-(SP) ; WIND ID
- CLR.L -(SP) ; put it on the heap
- MOVE.L #-1,-(SP) ; behind none
- _GetNewWindow
- LEA theWindow,A0
- MOVE.L (SP),(A0)
- MOVE.L (SP),-(SP)
- MOVE.L WSize,-(SP)
- CLR.W -(SP)
- _SizeWindow
- MOVE.L (SP),-(SP)
- _ShowWindow
- _SetPort
-
- ; create a temp scrap holder
- MOVE.L #10,D0 ; this is just a size
- _NewHandle ; create a handle
- MOVE.L A0,TextH-base(BP) ; to hold clipboard data
-
- ; Check for multitasking environment
- CLR MFlag-base(BP) ; set MFlag to 0
- MOVE.W #$A89F, D0 ; _Unimplemented
- _GetTrapAddress ; NGetTrapAddress
- MOVE.L A0,D1
- MOVE.W #$A860,D0 ; _WaitNextEvent
- _GetTrapAddress ; NGetTrapAddress
- CMP.L A0,D1
- BEQ.S @1 ; no multitasking
- MOVE.W #$100,MFlag-base(BP) ; set multitasking flag
-
- @1: RTS
-
- ; ----- Event Loop ------
-
- NextEvent:
- CLR KFlag-base(BP)
-
- MOVE Runner-base(BP),D0
- JSR 0(BP,D0.W) ; run the idle routine
-
- CLR -(SP) ; turn all menus white
- _HiLiteMenu
-
- MOVE.L #-1,-(SP) ; event mask and space for result
- PEA EventRecord-base(BP) ; event record to be filled
-
- TST.W MFlag-base(BP) ; running multitasking?
- BNE.S @0 ; if not, do SystemTask/GetNextEvent
-
- _SystemTask ; handle DA's, etc.
- _GetNextEvent ; fill the event record
- BRA.S @1
-
- @0: MOVEQ #0,D0
- MOVE.L D0,-(SP) ; 0 sleep ticks
- MOVE.L D0,-(SP) ; nil mouse region
- _WaitNextEvent ; get multitasking event
-
- @1: TST (SP)+ ; Is this an event?
- BEQ.S rdr ; no this is a non-event
-
- MOVE What-base(BP),D0 ; get event number
- CMPI #15,D0 ; is it a 'high level event'?
- BLE.S @2
- ; Yes: handle the new high level event
- MOVE hleHook-base(BP),D0 ; inital value: beep
- BRA.S hop2
- ; No: handle the old regular event
- @2: LEA Events-base(BP),A0
- hop1: ADD D0,D0 ; times two for event handler address access
- MOVE 0(A0,D0.W),D0
- hop2: JMP 0(BP,D0.W)
-
- ; -- Mouse Down Event --
-
- BDEvt: CLR -(SP) ; Result of find window
- MOVE.L Where-base(BP),-(SP) ; Mouse point of click.
- PEA WWindow-base(BP) ; Var. for pointer of clicked wind.
- _FindWindow ; Returns window region code ...
- CLR.L D0 ; ... (see p. WM-27 in IM).
- MOVE (SP)+,D0 ; Pop part number
- LEA Clicks-base(BP),A0 ; clicks is an array of rel.addrs
- BRA.S hop1
-
- MenuBar:
- CLR.L -(SP) ; Make room for menu choice data.
- MOVE.L Where-base(BP),-(SP) ; Mouse coordinates of click.
- _MenuSelect ; Get the selected Menu data.
- MOVE.L (SP)+,-(PS) ; menu ID and item to pstack.
- JMP DoMenu-base(BP)
-
- DARgn:
- PEA EventRecord-base(BP)
- MOVE.L WWindow-base(BP),-(SP)
- _SystemClick
- RTS
-
- DragRgn:
- MOVE.L WWindow-base(BP),-(SP) ; push The Window Pointer
- MOVE.L Where-base(BP),-(SP) ; push The Mouse Coordinates
- PEA BigRect-base(BP) ; The drag boundry limits
- _DragWindow ; Drag it
- rdr: RTS
-
- CloseRgn:
- CLR -(SP)
- MOVE.L WWindow-base(BP),-(SP)
- MOVE.L Where-base(BP),-(SP)
- _TrackGoAway
- MOVE (SP)+,D0
- BEQ.S rdr
- MOVE Closer-base(BP),D0 ; inital value: bye-base
- BRA.S hop2
-
- ContentRgn: ; select the clicked in window.
- MOVE.L WWindow-base(BP),-(SP)
- _SelectWindow
- MOVE Button-base(BP),D0 ; inital value: null-base
- BRA.S hop2
-
- ; -- Key Down Event --
-
- KeyEvt: _ObscureCursor
- MOVE Message+2-base(BP),D0
- AND #$FF,D0 ; D0 has the ASCII code of the key.
- MOVE Modify-base(BP),D1
- BTST #8,D1
- BNE.S CommandKey
- MOVE D0,kflag-base(BP)
- RTS
-
- ; Menu actions
- CommandKey: ; handle the menu choices.
- CLR.L -(SP) ; Room for menu data.
- MOVE D0,-(SP) ; Push ASCII.
- _MenuKey ; Get the menu data.
- MOVE.L (SP)+,-(PS) ; menu ID and item to pstack.
-
- DoMenu: ; Determine which menu was used.
- TST 2(PS) ; is the item number = 0?
- BEQ twodrop ; no menu selection, drop data
-
- CMPI #1,(PS) ; Is it the Apple menu? ...
- BEQ.S DoAppleMenu ; handle this special case
-
- CMPI #3,(PS) ; Is it the Edit menu?
- BNE.S @0 ; the last special case *
-
- CLR.L -(SP) ; Check if it's a DA window
- _FrontWindow
- MOVE.L (SP)+,A0
- TST $6C(A0) ; windowKind(FrontWindow)
- BGE.S @0 ; negative=dawindow
-
- TST (PS)+ ; drop the menu id
- CLR -(SP)
- MOVE (PS)+,-(SP) ; push item-1
- SUBQ #1,(SP)
- _SysEdit ; do the da edit stuff
- TST (SP)+
- RTS
-
- @0: MOVE YourMenu-base(BP),D0 ; inital value:
- LEA 0(BP,D0.W),A0 ; do a double indexed reference
- MOVE (PS)+,D0
- SUBQ #2,D0
- ADD D0,D0
- MOVE 0(A0,D0.W),D0
- LEA 0(BP,D0.W),A0
- MOVE (PS)+,D0
- SUBQ #1,D0
- JMP hop1-base(BP)
-
- DoAppleMenu:
- CLR (PS)+
- MOVE (PS)+,D1
- CMP #1,D1 ; Is it the first item?
- BNE.S @0
- MOVE about-base(BP),D0
- JMP 0(BP,D0.W)
- @0: PEA WWindow ; Its a DA
- _GetPort
- MOVE.L AppleMenu-base(BP),-(SP)
- MOVE D1,-(SP)
- PEA @1
- _GetItem
- CLR -(SP)
- PEA @1
- _OpenDeskAcc
- MOVE (SP)+,D0
- MOVE.L WWindow-base(BP),-(SP)
- _SetPort
- RTS
- @1: DCB.B 16,0 ; Name of the DA
-
- DoAbout:
- CLR -(SP) ; Room for which item number.
- MOVE #257,-(SP) ; Resource ID of AboutDialog
- CLR.L -(SP)
- _Alert ; About Item
- CLR (SP)+ ; Don't care which item dismissed.
- RTS
-
- Bye: _ExitToShell
-
- ; -- Update Event --
-
- UDEvt: PEA WWindow-base(BP)
- _GetPort
- MOVE.L WWindow-base(BP),-(SP) ; push for _SetPort
- MOVE.L Message-base(BP),-(SP) ; push wpointer for _EndUpdate
- ANDI.L #$00FFFFFF,(SP) ; Mask out the wpointer field.
- MOVE.L (SP),-(SP) ; push for _SetPort
- MOVE.L (SP),-(SP) ; push for _BeginUpdate
- _BeginUpdate ; restrict to invalid region
- _SetPort ; specify this window
- MOVE Update-base(BP),D0 ; inital value: curs-base
- JSR 0(BP,D0) ; execute the draw routine
- _EndUpdate ; go back to current cliprgn
- _SetPort
- RTS
-
- ; -- Activate Event --
-
- ActEvt:
- CLR -(PS) ; modify has on/off flag in bit 0
- BTST #0,Modify+1-base(BP)
- BEQ.S @0
- SUBQ #1,(PS)
- @0: MOVE Activate-base(BP),D0 ; inital value: drop
- JMP 0(BP,D0.W)
-
-
- ; ---- Other stuff ------
- TextNormal:
- _PenNormal ; 1X1, black, patcopy
- MOVE #4,-(SP) ; Monaco
- _TextFont
- MOVE #0,-(SP) ; plain text
- _TextFace
- MOVE #9,-(SP) ; 9 point
- _TextSize
- MOVE #0,-(SP) ; srcCopy
- _TextMode
- RTS
-
- ClearTermBuf:
- MOVEQ #76,D0
- LEA TermBuf-base(BP),IS
- @0: MOVE.L #$20202020,0(IS,D0) ; fill line buffer with blanks
- SUBQ.B #4,D0
- BGE.S @0
- RTS
-
- EmptyFS: ; clear pending loads from the file stack
- TST fsptr-base(BP)
- BMI.S @1
- LEA fstack-base(BP),A1
- MOVE fsptr-base(BP),D0
- MOVE.L 0(A1,D0),A0 ; A0 has the next load block addr
- MOVE.L A0,D1 ; dont try to dispose of nil handle*
- BEQ.S @0 ; *
- CLR.L 0(A1,D0)
- CMPA.L TextH-base(BP),A0
- BEQ.S @0
- _DisposHandle
- @0: SUBQ #4,fsptr-base(BP)
- BRA.S emptyfs
- @1: RTS
-
- Paste: JSR nocurs-base(BP)
- CLR.L -(SP)
- MOVE.L TextH-base(BP),-(SP) ; handle to the scrap data
- MOVE.L #'TEXT',-(SP)
- PEA TextO-Base(BP)
- _GetScrap
- MOVE.L (SP)+,TextE-base(BP) ; put the length at TextE
- MOVE.L TextH-base(BP),A0 ; get a handle to the scrap data
- MOVE.L (A0),D0 ; derefrence the scrap handle
- MOVE.L D0,TextO-base(BP) ; set TextO to start of scrap data
- ADD.L D0,TextE-base(BP) ; set TextE to end of scrap data
- _HLock ; don't let data move during paste
- CLR fsptr-base(BP)
- MOVE.L TextH-base(BP),fstack-base(BP)
- MOVE.L TextO-base(BP),fofsets-base(BP)
- MOVE.L TextE-base(BP),fends-base(BP)
- go: CLR.B fint-base(BP) ; leave keyboard mode
- JMP CRet-base(BP) ; get next line
-
- Pasting: ; GetInput comes here for input when fint-base(BP) is 0
- JSR ClearTermBuf-base(BP)
- CLR.L D1 ; clear the character count
- CLR.L D0 ; and the character
- MOVE.L TextO-base(BP),A0 ; set the input address
- @0: MOVE.B 0(A0,D1.W),D0 ; BEGIN get a character
- CMP.B #CR,D0 ; is it not a CR?
- BEQ.S @1
- CMPI.B #78,D1 ; or 78 characters in buffer
- BGE.S @1 ; WHILE
- MOVE.B D0,0(IS,D1) ; stash it into buffer
- ADDQ.B #1,D1 ; increment count
- BRA.S @0 ; REPEAT
- @1: ADDQ.B #1,D1 ; increment count
- MOVE.B #CR,0(IS,D1) ; stash CR into buffer
- MOVE D1,-(PS) ; preserve count for TYPE
- ADD.L TextO-base(BP),D1
- MOVE.L D1,TextO-base(BP)
- CMP.L TextE-base(BP),D1 ; IS the block done (TextO>TextE)?
- BMI.S tandr ; just type and return if not.
-
- MOVE fsptr-base(BP),D0
- LEA fstack-base(BP),A0
- MOVE.L 0(A0,D0.W),A0
- _HUnlock ; unlock the block
- BMI huh
- CMPA.L TextH-base(BP),A0
- BEQ.S @2 ; keep the scrap block
- _DisposHandle ; dispose of loaded blocks
- BMI huh
-
- @2: SUBQ #4,fsptr-base(BP) ; pop fstack
- BMI.S @3 ; branch if no pending loads
-
- MOVE fsptr-base(BP),D0
- LEA fofsets-base(BP),A0 ; set TextO to (fofsets+fsptr)
- MOVE.L 0(A0,D0.W),TextO-base(BP)
- LEA fends-base(BP),A0
- MOVE.L 0(A0,D0.W),TextE-base(BP)
- BRA.S tandr
-
- @3: BSET.B #7,fint-base(BP) ; set keyboard mode
- tandr: TST echo-base(BP)
- BNE.S @4
- JMP drop-base(BP)
-
- @4: JSR tib-base(BP)
- JSR swapp-base(BP)
- JSR type-base(BP)
- JMP doCR-base(BP) ; TIB count TYPE CR ;
-
- ; ----- Terminal Routines -----
- ; EmitCode and KeyCode implement a 64X16 terminal window.
-
- EmitCode: ; prints contents of D0 on current port at current location
- CMP.B #13,D0 ; is it a <cr>
- BEQ.S doCR
- CMP.B #8,D0 ; is it a <del>?
- BEQ.S doDEL
- ANDI #$FF,D0
- MOVE D0,-(A7)
- _DrawChar
-
- PEA Scratch-base(BP)
- _GetPen ; get current pen location
- MOVE Scratch+2-base(BP),D1 ; get h pos
- MOVE WContRect+6-base(BP),D0 ; right coord of WContRect
- CMP D0,D1 ; is the position beyond the edge
- BLS.S emitr ; no
-
- doCR: PEA Scratch-base(BP)
- _GetPen ; get current pen location
- MOVE Scratch-base(BP),D1
- MOVE WContRect+4-base(BP),D0 ; bottom coord of WContRect
- SUB #11,D0
- CMP D0,D1 ; is the position below the window
- BLS.S @0 ; no
-
- ; yes it is below the bottom of the window, so scroll up 11 pixels
- CLR.L -(A7) ; Make room for a region handle.
- _NewRgn ; get handle into (A7)
- PEA WContRect-base(BP) ; rect to scroll
- CLR -(A7) ; no horiz.
- MOVE #$FFF5,-(A7) ; 11 pix. vert.
- MOVE.L 8(A7),-(A7) ; push the region handle
- _ScrollRect
- _DisposRgn
-
- MOVE WContRect+4-base(BP),D1 ; bottom coord of WContRect
- SUBQ #4,D1
- BRA.S @1
-
- @0: ADD #11,D1 ; Add line height to pen location
- @1: MOVE #1,-(A7)
- MOVE D1,-(A7)
- _MoveTo
- emitr: RTS
-
- doDEL: ; it's a <del>
- PEA Scratch-base(BP)
- _GetPen ; get current pen location
- MOVE Scratch+2-base(BP),D1
- CMP #6,D1 ; first column?
- BLT Beep ; beep return
- SUB #6,D1 ; back up
- MOVE D1,-(SP)
- MOVE Scratch,-(SP)
- _MoveTo
- RTS
-
- KeyCode: ; waits for a key to be pressed; returns the ASCII in D0.
- BSR.S Curs
- @0: JSR NextEvent-base(BP)
- TST KFlag-base(BP)
- BEQ.S @0
- BSR.S NoCurs
- MOVE KFlag-base(BP),-(PS)
- RTS
-
- NoCurs: MOVE #10,-(SP) ; SrcXor mode
- _PenMode
- Curs: MOVE.L #$00000006,-(SP) ; move 6 pixels to the right
- _Move
- MOVE.L #$0000FFFA,-(SP) ; draw 6 pixels to the left
- _Line
- _PenNormal
- RTS
-
- Xpect: MOVEM.L D4/IS,-(SP) ; "expect"'s routine
- JSR swapp-base(BP) ; leave number of chars on stack
- MOVE (PS)+,D0 ; addr
- LEA 0(BP,D0.W),IS ; set IS to the input address
- CLR Counter
- MOVE (PS)+,D4
- @0: JSR key-base(BP)
- MOVE (PS)+,D5
- CMPI #CR,D5 ; if key = CR
- BNE.S @1
- MOVE.B #BL,0(IS,Counter)
- CLR.B 1(IS,Counter)
- MOVE.B #BL,2(IS,Counter)
- BRA.S @3
- @1: CMPI #BS,D5 ; if key = backspace
- BNE.S @2
- TST Counter ; do nothing if first key is BS
- BEQ.S @0
- SUBQ #1,Counter ; decriment counter
- JSR dodel-base(BP)
- JSR space-base(BP) ; ... rubout char
- JSR dodel-base(BP)
- BRA.S @0
- @2: MOVE.B D5,0(IS,Counter) ; stash the key into input buffer
- ADDQ #1,Counter
- MOVE D5,D0
- JSR emitcode-base(BP)
- CMP D4,Counter ; is count=number of chars to get?
- BNE.S @0
- @3: JSR docr-base(BP)
- MOVEM.L (SP)+,D4/IS
- RTS
-
- ; --- End of unnamed MacSpecific Code ---
-